/*
 * Snapshooter.java   0.0.1    30/ott/2009
 * 
 * Copyright (c) 2009 mentalsmash.org
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * The use of the Apache License does not indicate that this project is
 * affiliated with the Apache Software Foundation.
 */
package org.mentalsmash.tazio.transactions.control;

import java.util.Map;

import org.mentalsmash.tazio.transactions.model.PrivateSnapshot;
import org.mentalsmash.tazio.transactions.model.Snapshot;
import org.mentalsmash.tazio.transactions.model.TransactionalObject;
import org.mentalsmash.tazio.transactions.model.identifiers.OID;

/**
 * A <tt>Snapshooter</tt> is a component of the Tazio Transactions System
 * intended to take snapshots of transactional objects at a given point in time.
 * <p>
 * It basically provides just one method,which - given one TransactionalObject
 * and a destination Map - walks the transactional objects and its references
 * and adds the necessary snapshots to the map
 * </p>
 * 
 * @author Andrea Reale
 * @version 0.0.1
 * @see PrivateSnapshot
 * @see TransactionalObject
 */
public interface Snapshooter {

    /**
     * Creates a snapshot of the given {@link TransactionalObject}
     * 
     * @param target
     *            the {@link TransactionalObject} to snapshoot
     * @param destination
     *            a writable (not necessarily emtpy) Map were the created
     *            snapshots are to put
     * @return a new instance of {@link PrivateSnapshot} for the given
     *         TransactionalObject
     */
    void createSnapshot(TransactionalObject target,
	    Map<OID, Snapshot> destination);
}
